package main

import (
	"encoding/json"
	"fmt"
	"io"
	"net/http"
	"os"
	"reflect"
	"runtime"
	"strings"
	"time"
)

// 文章数据结构定义
type Article struct {
	ID           int    `json:"id"`
	Title        string `json:"title"`
	Pic          string `json:"pic"`
	Content      string `json:"content"`
	CategoryID   int    `json:"categoryId"`
	IsRecommend  bool   `json:"isRecommend"`
	CreateTime   string `json:"createTime"`
	ViewCount    int    `json:"viewCount"`
	Keywords     string `json:"keywords"`
	Description  string `json:"descript"`
	Author       string `json:"author"`
}

// API响应结构
type APIResponse struct {
	Code int       `json:"code"`
	Data []Article `json:"data"`
	Msg  string    `json:"msg"`
}

// 配置项结构
type Config struct {
	Key   string `json:"key"`
	Value string `json:"value"`
}

type ConfigResponse struct {
	Code int      `json:"code"`
	Data []Config `json:"data"`
	Msg  string   `json:"msg"`
}

func main() {
	fmt.Println("🔍 检查摄影展小程序文章Schema...")
	fmt.Println("====================================================")

	// 1. 检查配置接口
	fmt.Println("1. 检查系统配置接口...")
	checkConfigAPI()

	// 2. 检查文章列表接口
	fmt.Println("\n2. 检查文章列表接口...")
	checkArticleListAPI()

	// 3. 检查文章详情接口（如果文章存在的话）
	fmt.Println("\n3. 检查文章详情接口...")
	// checkArticleDetailAPI()

	fmt.Println("\n✅ Schema检查完成!")
}

func checkConfigAPI() {
	url := "https://api.it120.cc/photography/config/values?keys=mallName,mylogo,myname,tel"

	resp, err := http.Get(url)
	if err != nil {
		fmt.Printf("❌ 请求配置接口失败: %v\n", err)
		return
	}
	defer resp.Body.Close()

	body, err := io.ReadAll(resp.Body)
	if err != nil {
		fmt.Printf("❌ 读取响应失败: %v\n", err)
		return
	}

	var configResp ConfigResponse
	if err := json.Unmarshal(body, &configResp); err != nil {
		fmt.Printf("❌ 解析JSON失败: %v\n", err)
		fmt.Printf("原始响应: %s\n", string(body))
		return
	}

	if configResp.Code != 0 {
		fmt.Printf("❌ API返回错误: code=%d, msg=%s\n", configResp.Code, configResp.Msg)
		return
	}

	fmt.Printf("✅ 配置接口正常，返回 %d 个配置项\n", len(configResp.Data))
	for _, config := range configResp.Data {
		fmt.Printf("   - %s: %s\n", config.Key, config.Value)
	}
}

func checkArticleListAPI() {
	url := "https://api.it120.cc/photography/cms/news/list"

	// 构造POST请求数据
	postData := `{"isRecommend": true, "page": 1}`

	resp, err := http.Post(url, "application/json", strings.NewReader(postData))
	if err != nil {
		fmt.Printf("❌ 请求文章列表接口失败: %v\n", err)
		return
	}
	defer resp.Body.Close()

	body, err := io.ReadAll(resp.Body)
	if err != nil {
		fmt.Printf("❌ 读取响应失败: %v\n", err)
		return
	}

	var apiResp APIResponse
	if err := json.Unmarshal(body, &apiResp); err != nil {
		fmt.Printf("❌ 解析JSON失败: %v\n", err)
		fmt.Printf("原始响应: %s\n", string(body))
		return
	}

	if apiResp.Code != 0 {
		fmt.Printf("❌ API返回错误: code=%d, msg=%s\n", apiResp.Code, apiResp.Msg)
		return
	}

	fmt.Printf("✅ 文章列表接口正常，返回 %d 篇文章\n", len(apiResp.Data))

	if len(apiResp.Data) > 0 {
		fmt.Println("\n📄 文章Schema验证:")
		validateArticleSchema(apiResp.Data[0])

		fmt.Println("\n📋 文章列表预览:")
		for i, article := range apiResp.Data {
			if i >= 3 { // 只显示前3篇
				fmt.Printf("   ... 还有 %d 篇文章\n", len(apiResp.Data)-3)
				break
			}
			fmt.Printf("   %d. %s (ID: %d, 浏览: %d)\n",
				i+1, article.Title, article.ID, article.ViewCount)
		}
	}
}

func validateArticleSchema(article Article) {
	fmt.Println("   检查文章字段:")

	v := reflect.ValueOf(article)
	t := reflect.TypeOf(article)

	for i := 0; i < v.NumField(); i++ {
		field := v.Field(i)
		fieldType := t.Field(i)
		jsonTag := fieldType.Tag.Get("json")

		var status string
		var value interface{}

		switch field.Kind() {
		case reflect.String:
			value = field.String()
			if field.String() != "" {
				status = "✅"
			} else {
				status = "⚠️"
			}
		case reflect.Int:
			value = field.Int()
			if field.Int() > 0 {
				status = "✅"
			} else {
				status = "⚠️"
			}
		case reflect.Bool:
			value = field.Bool()
			status = "✅"
		default:
			value = field.Interface()
			status = "✅"
		}

		fmt.Printf("   %s %-15s (%s): %v\n",
			status, jsonTag, fieldType.Type.String(), value)
	}
}

// 检查Go环境
func init() {
	// 检查Go版本
	fmt.Printf("Go版本: %s\n", runtime.Version())
	fmt.Printf("运行时间: %s\n", time.Now().Format("2006-01-02 15:04:05"))
	fmt.Println()
}